#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>

using namespace std;
using LL = long long;
const int N = 2e5 + 10;
/*
题目是将一颗树拆分成[2, k]颗子树，每颗子树的xor值相等，设树的所有叶子的xor值为s
当子树的数量 >= 4 时候选择其中的三课 x xor x xor x = x 即 s = x
经过n步最终变成 x
如果k == 2 时， 只有两颗子树 x xor x = 0 即 s = 0

因此当 k > 2 时
只要应当满足，2颗子树的xor值为s

*/
int n, k;
vector<int> v[N];
int a[N], t[N];
int s;
bool flag = false;

int dfs(int u, int fa){
    t[u] = a[u];
    for(auto k : v[u]){
        if(k == fa) continue;
        t[u] ^= dfs(k, u);
    }

    return t[u];
}


void find(int u, int fa){
    for(int it : v[u]){
        if(it == fa) continue;

        find(it, u);
        if(t[it] == s && !flag){
            flag = true;
            v[u].erase(find(v[u].begin(), v[u].end(), it));
            return;
        }

    }
}

void solve(){
    s = 0;
    cin >> n >> k;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    for(int i = 1; i <= n; i ++) v[i].clear();

    for(int i = 1, a, b; i < n; i ++){
        cin >> a >> b;
        v[a].push_back(b), v[b].push_back(a);
    }

    for(int i = 1; i <= n; i ++) s ^= a[i];

    if(s == 0){
        cout << "YES" << '\n';
        return;
    }

    if(k == 2){
        cout << "NO" << '\n';
        return;
    }

    dfs(1, 1);
    find(1, 1);

    if(flag){
        flag = false;
        dfs(1, 1);
        find(1, 1);

        if(flag){
            cout << "YES" << '\n';
            return;
        }
    }

    cout << "NO" << '\n';
}

int main(){
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while(T--){
        solve();
    }

    return 0;
}